Supabase の RLS ハマりポイントやっと解決
冬の LaunchWeek で pg_crdt が紹介されてから、yjs と Supabase Realtime のつなぎこみを思い出しては試行錯誤していた せっかくなので RLS(Row Level Security) を有効にしたいよねってことで試してた
プロジェクトがあって、メンバーがいて、ページがいて...みたいな DB スキーマで、RLS のサンプルでも多対多の中間テーブルを作成して、RLS の USING 句の中で中間テーブルと auth.uid() を突き合わせて認証状態を検証する....ということにトライしてたんだが、サンプル相当の SQL を書いても406が返ってきて困った ここで完全に盲点だったのは、この中間テーブル自体の RLS の状態で、ページの RLS 単体をいじってても中間テーブルの RLS が有効になっていて、ポリシーがない状態(これがデフォルトになっちゃうのでハマっていた)だとページの RLS で中間テーブルの RLS が突合できなくてダメだったっぽい
よくよーくドキュメントを読むと
Note: If RLS is also enabled for members, the user must also have read (select) access to members. Otherwise the joined query will not yield any results.
て書いてあって膝を打った
https://gyazo.com/9abaef2e344808feaa2b168aba332743
なんかキャレットの追従があやしかったり、日本語を入力する時に確定前のワードが投入されてたりいささか怪しい部分はあるけど Supabase をバックエンドに Realtime で複数クライアントで共同編集できるモノが動いた